import java.math.BigDecimal;
import java.time.*;

public class bingbing {
    private static final BigDecimal MINUTE_RATE_LESS_THAN_20_MINUTES = new BigDecimal("0.05");
    private static final BigDecimal MINUTE_RATE_GREATER_THAN_20_MINUTES = new BigDecimal("0.10");
    private static final BigDecimal BASE_FEE_GREATER_THAN_20_MINUTES = new BigDecimal("1.00");

    // 计算通话时长
    public long calculateTimeSpan(LocalDateTime startTime, LocalDateTime endTime) {
        ZoneId zoneId = ZoneId.of("America/New_York");

        // 获取夏令时和秋令时的时间点（以美国东部时区为准）
        LocalDateTime dstStart = LocalDateTime.of(endTime.getYear(), 3, 26, 2, 0);
        while (dstStart.getDayOfWeek().getValue() != 7) {
            dstStart = dstStart.plusDays(1);
        }
        dstStart = dstStart.plusDays(14 - dstStart.getDayOfWeek().getValue());

        LocalDateTime stdEnd = LocalDateTime.of(endTime.getYear(), 11, 6, 2, 59);
        while (stdEnd.getDayOfWeek().getValue() != 7) {
            stdEnd = stdEnd.plusDays(1);
        }
        stdEnd = stdEnd.plusDays(7 - stdEnd.getDayOfWeek().getValue());

        // 将开始时间和结束时间转换为ZonedDateTime对象，并指定美国东部时区
        ZonedDateTime start = ZonedDateTime.of(startTime, zoneId);
        ZonedDateTime end = ZonedDateTime.of(endTime, zoneId);

        // 判断是否处于夏令时和秋令时
        boolean isDstStart = start.getZone().getRules().isDaylightSavings(start.toInstant());
        boolean isDstEnd = end.getZone().getRules().isDaylightSavings(end.toInstant());

        if (isDstStart) {
            start = start.plusHours(1);
        }
        if (isDstEnd) {
            end = end.plusHours(1);
        }

        // 如果处于秋令时，将结束时间向后调整一小时
        if (start.toLocalDateTime().isAfter(dstStart.minusHours(1)) && start.toLocalDateTime().isBefore(stdEnd)) {
            start = start.plusHours(1);
        }
        if (end.toLocalDateTime().isAfter(dstStart) && end.toLocalDateTime().isBefore(stdEnd.plusHours(1))) {
            end = end.plusHours(1);
        }

        // 如果处于夏令时，将结束时间向前调整一小时
        if (!isDstStart && isDstEnd) {
            end = end.minusHours(1);
        }

        // 计算通话时长（单位为分钟）
        Duration duration = Duration.between(start, end);
        return (long) Math.ceil((double) duration.toSeconds() / 60);
    }
    // 计算通话费用
    public BigDecimal calculateFee(LocalDateTime startTime, LocalDateTime endTime) {
        // 计算通话时长（单位为分钟）
        long duration = calculateTimeSpan(startTime, endTime);

        // 计算费用
        if (duration <= 0) {
            return BigDecimal.ZERO;
        } else if (duration <= 1) {
            return MINUTE_RATE_LESS_THAN_20_MINUTES;
        } else if (duration <= 20) {
            return MINUTE_RATE_LESS_THAN_20_MINUTES.multiply(BigDecimal.valueOf(duration));
        } else {
            BigDecimal fee = BASE_FEE_GREATER_THAN_20_MINUTES;
            duration -= 20;
            fee = fee.add(MINUTE_RATE_GREATER_THAN_20_MINUTES.multiply(BigDecimal.valueOf(duration)));
            return fee;
        }
    }
}